Go 转 Rust 很难 ,面试也逃不过手撕算法!

收录于 · Rust高性能&AI大模型

1 人赞同了该文章

大家好,我是渔夫。

今天分享主题,最近有位伙伴面试 Rust 岗位要求手撕算法了,心想 Rust 学习起来够费劲了,应该没有算法环节,没想到还是逃不过。

这位伙伴之前经验,在广州某家做 虚拟化存储 方向,主要是 Go 开发,也写 C/C++ 不过相对较少。这次跳槽就是想上班自由,所以就找个远程公司,刚好找到一个纯 Rust 开发的。

面试开始!

一位体态丰腴,身着格子衫中年男,手持一台布满划痕的 MacBook 向我缓步走来,看着快秃顶的头发,让人不禁暗自猜测,肯定是位资深的顶级架构师。

看了眼简历,咱们直接开门见山,先来个简单点算法题热身吧。

Go版本:两个 goroutine 交替执行打印数字和字母

你之前是写 Go 语言的嘛,先尝试用 Go 实现两个 goroutine 交替执行打印数字和字母。

var ch1 = make(chan bool,1)
var ch2 = make(chan bool)
func f() {
 ch1 <- true
 for i:=1;i<=10;i+= 2{
  <- ch1
  fmt.Print(i)
  fmt.Print(i+1," ")
  ch2 <- true
 }
}
func f2() {
 for i:='A';i<='J';i+=2{
  <- ch2
  fmt.Print(string(i))
  fmt.Print(string(i+1)," ")
  ch1 <- true
 }
}

func main() {
 go f1()
 go f2()
 time.Sleep(time.Second)
}

然后,期间问些八股文的题,如下:

八股文

八股文回答差不多了,面试说,那我们今天面试差不多了,再来一天算法就结束今天面试,前面你使用 Go 的写实现两个 goroutine 交替执行打印数字和字母。那么我们换 Rust 版本,实现完成咱们今天就面试结束。

Rust 版本:交替执行打印数字和字母

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // 使用 Arc 和 Mutex 来共享状态
    let counter = Arc::newnew(1);

    let counter_clone = Arc::clone(&counter);

    // 创建一个线程打印数字
    let handle1 = thread::spawn(move || {
        print_numbers(counter_clone);
    });

    // 创建另一个线程打印字母
    let handle2 = thread::spawn(move || {
        print_letters(counter);
    });

    // 等待两个线程完成
    handle1.join().unwrap();
    handle2.join().unwrap();
}

fn print_numbers(counter: Arc<Mutex<i32>>) {
    for _ in 0..5 {
        let mut num = counter.lock().unwrap();
        println!("{}", *num);
        *num += 1;
    }
}

fn print_letters(counter: Arc<Mutex<i32>>) {
    for _ in 0..5 {
        let letter = char::from_u32('A' as u32 + counter.lock().unwrap().rem_euclid(26) as u32)
            .unwrap();
        println!("{}", letter);
    }
}

我是渔夫,现在在国内某某云程序员,业余独立开发者,探索副业,生活、技术、非科班转码经验等相关文章,欢迎关注,和渔夫一起成长。

发布于 2024-02-29 21:30・贵州自学5个月Java找到了9K的工作,我的方式值得大家借鉴

[

我是去年9月22日才正式学习Java的,因为在国营单位工作了4年,在天津一个月工资只有5000块,而且看不到任何晋升的希望...

](https://zhuanlan.zhihu.com/p/357175586)